package hch.redesFerroviarias;

import hch.utils.Sentido;

import java.util.List;
import java.util.concurrent.locks.Condition;


public class Pasajero extends Thread{
	private int id;
	private int estacionSalida;
	private int estacionDestino;
	private int destinoActual;
	private Sentido sentido;
	private Condition estaEnViaje = RedFerroviaria1.LOCK.newCondition();	
	private RedFerroviaria red;
	private boolean trasbordo = false;
	
	public Pasajero(int id, int estacionSalida, int estacionDestino, RedFerroviaria red){
		this.id = id;
		this.estacionSalida = estacionSalida;
		this.estacionDestino = estacionDestino;
		this.red = red;
		this.sentido = this.obtenerSentido();
		
	}

	//*************//
	//** METHODS **//
	//*************//
	private Sentido obtenerSentido(){
		List<Estacion> estaciones = this.red.getEstaciones();
		this.destinoActual = estacionDestino;
		if(estacionDestino > estaciones.get(estaciones.size()-1).getId()){
			this.trasbordo = true;
			this.destinoActual = red.getEstacionTrasbordo().getId();
			}else{
				  if(estacionDestino < estaciones.get(0).getId()){
					  this.trasbordo = true;
				  	  this.destinoActual = red.getEstacionTrasbordo().getId();
				  }
		}
		int recorridosDerecha = destinoActual - estacionSalida;
		if(recorridosDerecha < red.getMinNroEstacion())
			recorridosDerecha += red.getNroEstaciones();
		int recorridosIzquierda = red.getNroEstaciones() - recorridosDerecha;
		if( recorridosIzquierda < recorridosDerecha)
			return Sentido.IZQUIERDA;
		return Sentido.DERECHA;
	}
	
	@Override
	public void run() {
		Estacion estacion;
		boolean estaEnEstacion = false;
		boolean hiceTrasbordo = false;
		while(this.estacionSalida != this.destinoActual && (!hiceTrasbordo)){
			RedFerroviaria1.LOCK.lock();
			try {
				estacion = this.red.getEstaciones().get(this.estacionSalida-this.red.getMinNroEstacion());
				if(!estaEnEstacion){
					estacion.agregarPasajero();
					estaEnEstacion = true;
				}
				estacion.getPuedenSubir().await(); //Espera en la estacion.
				Tren tren = estacion.getTrenes().get(0);
				if(tren.getCapacidadActual() < tren.getCapacidadMax() && tren.getSentido() == this.sentido){
					tren.agregarPasajero();
					estacion.restarPasajero();
					estacion = this.red.getEstaciones().get(this.destinoActual-this.red.getMinNroEstacion());
					estacion.sumarAlContador(tren.getTId());
					estacion.getPuedenBajar(tren.getTId()).await(); //Espera hasta que llega a la estacion destino.
					tren.removerPasajero();
					if(this.trasbordo){
						//REVISAR
						EstacionTrasbordo.pasajerosTrasbordo.add(this); //Pasajero a hacer trasbordo
						Thread.sleep(1000);
						hiceTrasbordo = true;
					}else{
						estacion.agregarPasajero();
						this.estacionSalida = this.destinoActual;
					}
					
				}
			} catch (InterruptedException e) {}
			RedFerroviaria1.LOCK.unlock();
		}
	}
	
	//**************//
	//** ACCESORS **//
	//**************//	
	
	public int getIDP() {
		return this.id;
	}
	
	public int getEstacionDestino() {
		return estacionDestino;
	}
	
	public Condition getEstaEnViaje() {
		return estaEnViaje;
	}
	
	public Sentido getSentido() {
		return sentido;
	}
	
	public int getEstacionSalida() {
		return estacionSalida;
	}
	
	public RedFerroviaria getRed() {
		return red;
	}
	
	public boolean getTrasbordo() {
		return trasbordo;
	}
	
	@Override
	public String toString() {
		return "Pasajero"+id;
	}


}
